(function(){

function animationStart(el, type){
	if(type === "in"){
		el.show().addClass("pop in ui-transitioning").one("webkitAnimationEnd", function(){
			$(this).removeClass("pop in ui-transitioning");
		});
	}
	else{
		el.addClass("pop out reverse ui-transitioning").one("webkitAnimationEnd", function(){
			$(this).removeClass("pop out reverse ui-transitioning").hide();
		});
	}
}

(function(){
	var alertEl = $("<div>", {
		"class": "messagebox"
	}),
	htmlStr = '<button class="close">Close</button>';
	alertEl.html(htmlStr);

	$(function(){
		$("body").append(alertEl);
	});

	var Alert = {
		show: function(config){
			var deferred = new $.Deferred();
			var title = config.title || "";
			var content = config.content || "";
			
			alertEl.find(".title").html(title);
			alertEl.find(".content").html(content);
			alertEl.find(".close").one("click", { deferred: deferred }, function(e){
				var deferred = e.data.deferred;
				deferred.resolve();
				return false;
			});

			animationStart(alertEl, "in");
			return deferred;
		},
		hide: function(){
			animationStart(alertEl, "out");
		}
	};

	/**
	 * @static
	 * @memberof ScLibs.ui
	 * @desc alert 를 띄운다. close 버튼을 클릭할 경우 반환한 promise 객체의 done 메소드로 이벤트를 지정하여 통지 받을 수 있다.
	 * @example
	 * var promise = ScLibs.ui.Alert.show({ title: "제목", content: "내용"});
	 * promise.done(function(){
	 *		
	 * });
	 * <br /><br />
	 * ScLibs.ui.Alert.hide();
	 */
	ScLibs.ui.Alert = Alert;
}());


(function(){
	//confirm
	var confirmEl = $("<div>", {
		"class": "messagebox"
	}),
	htmlStr = '<div class="messagebox-inner"></div>';
	confirmEl.html(htmlStr);

	$(function(){
		$("body").append(confirmEl);
	});

	var Confirm = {
		show: function(config){
			var deferred = new $.Deferred();
			var title = config.title || "";
			var content = config.content || "";
			
			confirmEl.find(".title").html(title);
			confirmEl.find(".content").html(content);	
			confirmEl.find(".ok").one("click", { deferred: deferred }, function(e){
				var deferred = e.data.deferred;
				deferred.resolve();
				return false;
			});
			
			confirmEl.find(".cancle").one("click", { deferred: deferred }, function(e){
				var deferred = e.data.deferred;
				deferred.reject();
				return false;
			});
			
			animationStart(confirmEl, "in", deferred);
			return deferred;
		},
		hide: function(){
			var deferred = new $.Deferred();
			animationStart(confirmEl, "out", deferred);
			return deferred;
		}
	};

	/**
	 * @static
	 * @memberof ScLibs.ui
	 * @desc Confirm 를 띄운다. OK 버튼을 클릭할 경우 반환한 promise 객체의 done 메소드로 이벤트를 지정하여 통지 받을 수 있다. <br/> Cancel 버튼 클릭시 fail 메소드를 정의 하여 통지 받는다.
	 * @example
	 * var promise = ScLibs.ui.Confirm.show({ title: "제목", content: "내용"});
	 * promise.done(function(){
	 *		
	 * });
	 * promise.fail(function(){
	 *		
	 * });
	 * <br /><br />
	 * ScLibs.ui.Confirm.hide();
	 */
	ScLibs.ui.Confirm = Confirm;
}());


(function(){
	var Dialog = {
		show: function(el){			
			animationStart(el, "in");
		},
		hide: function(el){
			animationStart(el, "out");
		}
	};

	/**
	 * @static
	 * @memberof ScLibs.ui
	 * @desc Dialog 를 띄운다. promise 객체를 반환하지 않는다.
	 * @example
	 * ScLibs.ui.Dialog.show($(".el"));
	 * <br /><br />
	 * ScLibs.ui.Dialog.hide($(".el"));
	 */
	ScLibs.ui.Dialog = Dialog;
}());

})();

